gtkwindow: Use actions from focused widget to activate accel
authorCarlos Soriano <carlos.sorian89@gmail.com>
Wed, 3 Dec 2014 14:53:59 +0000 (15:53 +0100)
committerChristian Hergert <christian@hergert.me>
Tue, 9 Dec 2014 04:19:33 +0000 (20:19 -0800)
Currently we only take into account the window GActionGroup for
activating the accels.

However, the application could have some custom GActionGroup in the
chain of focused widgets that could want to activate some action if
some accel is activated while that widget is focused.

To allow applications to set accels on widgets that use custom
GActionGroups, simply use the muxer of the focused widget, which
already contains the actions of the parents.

https://bugzilla.gnome.org/show_bug.cgi?id=740682

gtk/gtkactionhelper.c
gtk/gtkmenusectionbox.c
gtk/gtkmenushell.c
gtk/gtkwidget.c
gtk/gtkwidgetprivate.h
gtk/gtkwindow.c

index a9276d5b33fe81f1c5498c9fb0322e344b665117..50060ee092c3e9e569b17d7e05e44a53bb4f5e51 100644 (file)
@@ -397,7 +397,7 @@ gtk_action_helper_new (GtkActionable *widget)
         g_object_get (G_OBJECT (helper->widget), "active", &helper->active, NULL);
     }
 
-  helper->action_context = _gtk_widget_get_action_muxer (GTK_WIDGET (widget));
+  helper->action_context = _gtk_widget_get_action_muxer (GTK_WIDGET (widget), TRUE);
 
   return helper;
 }
index 9905fa737d0b7905e64d09ae586dbea9124f8ca5..e6b93748eb42477ec57efb1b12d1d905d8c54feb 100644 (file)
@@ -379,7 +379,7 @@ gtk_menu_section_box_new_toplevel (GtkStack    *stack,
   box = g_object_new (GTK_TYPE_MENU_SECTION_BOX, "margin", 10,  NULL);
   gtk_stack_add_named (stack, GTK_WIDGET (box), "main");
 
-  box->tracker = gtk_menu_tracker_new (GTK_ACTION_OBSERVABLE (_gtk_widget_get_action_muxer (GTK_WIDGET (box))),
+  box->tracker = gtk_menu_tracker_new (GTK_ACTION_OBSERVABLE (_gtk_widget_get_action_muxer (GTK_WIDGET (box), TRUE)),
                                        model, TRUE, FALSE, action_namespace,
                                        gtk_menu_section_box_insert_func,
                                        gtk_menu_section_box_remove_func, box);
index d1d0c7f07b321df2f9717b8cc04f7fb4bf5258d6..939d5f4462d484e5e80067715dbcd7ace81496fa 100644 (file)
@@ -2194,7 +2194,7 @@ gtk_menu_shell_bind_model (GtkMenuShell *menu_shell,
   g_return_if_fail (GTK_IS_MENU_SHELL (menu_shell));
   g_return_if_fail (model == NULL || G_IS_MENU_MODEL (model));
 
-  muxer = _gtk_widget_get_action_muxer (GTK_WIDGET (menu_shell));
+  muxer = _gtk_widget_get_action_muxer (GTK_WIDGET (menu_shell), TRUE);
 
   g_clear_pointer (&menu_shell->priv->tracker, gtk_menu_tracker_free);
 
index f0f2f6aa5896e55efe4164ade9358f949925659f..50ca98bf11a717c6df88a29cb9977386e2dab39a 100644 (file)
@@ -16481,45 +16481,54 @@ _gtk_widget_set_style (GtkWidget *widget,
   widget->priv->style = style;
 }
 
-void
-_gtk_widget_update_parent_muxer (GtkWidget *widget)
+GtkActionMuxer *
+_gtk_widget_get_parent_muxer (GtkWidget *widget,
+                              gboolean   create)
 {
-  GtkActionMuxer *parent_muxer;
-
-  if (widget->priv->muxer == NULL)
-    return;
+  GtkWidget *parent;
 
   if (GTK_IS_WINDOW (widget))
-    {
-      parent_muxer = gtk_application_get_parent_muxer_for_window (GTK_WINDOW (widget));
-    }
+    return gtk_application_get_parent_muxer_for_window (GTK_WINDOW (widget));
+
+  if (GTK_IS_MENU (widget))
+    parent = gtk_menu_get_attach_widget (GTK_MENU (widget));
+  else if (GTK_IS_POPOVER (widget))
+    parent = gtk_popover_get_relative_to (GTK_POPOVER (widget));
   else
-    {
-      GtkWidget *parent;
+    parent = gtk_widget_get_parent (widget);
 
-      if (GTK_IS_MENU (widget))
-        parent = gtk_menu_get_attach_widget (GTK_MENU (widget));
-      else if (GTK_IS_POPOVER (widget))
-        parent = gtk_popover_get_relative_to (GTK_POPOVER (widget));
-      else
-        parent = gtk_widget_get_parent (widget);
+  if (parent)
+    return _gtk_widget_get_action_muxer (parent, create);
 
-      parent_muxer = parent ? _gtk_widget_get_action_muxer (parent) : NULL;
-    }
+  return NULL;
+}
+
+void
+_gtk_widget_update_parent_muxer (GtkWidget *widget)
+{
+  if (widget->priv->muxer == NULL)
+    return;
 
-  gtk_action_muxer_set_parent (widget->priv->muxer, parent_muxer);
+  gtk_action_muxer_set_parent (widget->priv->muxer,
+                               _gtk_widget_get_parent_muxer (widget, TRUE));
 }
 
 GtkActionMuxer *
-_gtk_widget_get_action_muxer (GtkWidget *widget)
+_gtk_widget_get_action_muxer (GtkWidget *widget,
+                              gboolean   create)
 {
-  if (widget->priv->muxer == NULL)
+  if (widget->priv->muxer)
+    return widget->priv->muxer;
+
+  if (create)
     {
       widget->priv->muxer = gtk_action_muxer_new ();
       _gtk_widget_update_parent_muxer (widget);
-    }
 
-  return widget->priv->muxer;
+      return widget->priv->muxer;
+    }
+  else
+    return _gtk_widget_get_parent_muxer (widget, FALSE);
 }
 
 /**
@@ -16548,7 +16557,7 @@ gtk_widget_insert_action_group (GtkWidget    *widget,
   g_return_if_fail (GTK_IS_WIDGET (widget));
   g_return_if_fail (name != NULL);
 
-  muxer = _gtk_widget_get_action_muxer (widget);
+  muxer = _gtk_widget_get_action_muxer (widget, TRUE);
 
   if (group)
     gtk_action_muxer_insert (muxer, name, group);
index 6eddbb45e721503ea95a5a3a38c460b0dfbbd42f..6fd7a633463094a9a0d09f5585035330810e49b5 100644 (file)
@@ -151,7 +151,8 @@ void              _gtk_widget_invalidate_style_context     (GtkWidget    *widget
 void              _gtk_widget_style_context_invalidated    (GtkWidget    *widget);
 
 void              _gtk_widget_update_parent_muxer          (GtkWidget    *widget);
-GtkActionMuxer *  _gtk_widget_get_action_muxer             (GtkWidget    *widget);
+GtkActionMuxer *  _gtk_widget_get_action_muxer             (GtkWidget    *widget,
+                                                            gboolean      create);
 gchar **          _gtk_widget_list_action_prefixes         (GtkWidget    *widget);
 GActionGroup *    _gtk_widget_get_action_group             (GtkWidget    *widget,
                                                             const gchar  *prefix);
index 16f7e049dc81518afcb39b23fd5032c6dafc3053..842a5ff0aceac0f4ec90851fc9024e2618087989 100644 (file)
@@ -11214,7 +11214,12 @@ gtk_window_activate_key (GtkWindow   *window,
 
               if (window->priv->application)
                 {
-                  GtkActionMuxer *muxer = _gtk_widget_get_action_muxer (GTK_WIDGET (window));
+                  GtkWidget *focused_widget = gtk_window_get_focus (window);
+                  if (focused_widget == NULL)
+                    return FALSE;
+                  GtkActionMuxer *muxer = _gtk_widget_get_action_muxer (focused_widget, FALSE);
+                  if (muxer == NULL)
+                    return FALSE;
 
                   return gtk_application_activate_accel (window->priv->application,
                                                          G_ACTION_GROUP (muxer),